#!/usr/bin/env node

//recupero i moduli
var express = require('express');
var app = express();
var share   = require('share').server;
var options = require('./db/options');
var cr = require('./db/create');
var hbs = require('hbs');
var AWS = require('aws-sdk');
//var fs = require('fs');
//var bind = require('bind');

//creo la variabile per la wait 
var time = 42000;

//carico i dati per amazon
AWS.config.update({accessKeyId: options.db.amazon_access_key, secretAccessKey: options.db.amazon_secret_key, region: options.db.amazon_region});

//dichiaro le variabili per amazon
var db = new AWS.DynamoDB();
var s3 = new AWS.S3();

app.configure(function(){
    app.use(express.cookieParser());
    app.use(express.session({secret: 'EKIRTSYKCUL'}));
    app.set('view engine', 'html');
    app.engine('html', hbs.__express);
    app.set('views', __dirname + '/html');
    app.use(express.bodyParser());
    app.use(app.router);
    app.use(express.static(__dirname + '/html'));
});

app.get('/', function(req, res) {
    //setto la variabile di sessione
    //req.session.lastPage = '/index';
    //console.log(req.session.lastPage);
    s3.listObjects({
        Bucket: options.db.amazon_s3_snapshots_bucket_name
    }, function(err, data) {
        //console.log(data);
        //console.log(data.Contents.length);
        DocList = new Array();
        
        for (i = 0; i < data.Contents.length; i++) {
            //console.log(data.Contents[i].Key);
            var file = data.Contents[i].Key;
            //console.log("file è uguale a "+ file);
            var name = file.substr(0, (file.indexOf('/')) )
            //console.log ("name è uguale a "+name)
            DocList[i] = name;
            //console.log(DocList[i]);
            //console.log(addy.substr( (addy.indexOf('/')+1), (addy.indexOf('.')-2) ));
            //chiamo la set
            //app.set(link[i], name);
            //console.log(link[i]);
        }
        res.render('index',{documents:DocList});
    });    
});

// app.get('/editor.html', function(req, res){
// 	var titolo = req.query.titolo;
//     res.render('editor',{nome:titolo});
// });


app.get('/editor.html', function(req, res){
    console.log(req.session.lastPage);
    //controllo la sessione per capire da dove vengo e cosa devo fare
    /*if (req.session.lastPage != '/index' && req.session.lastPage != '/editor'){
        console.log('NO!!!!!!!!');
        //req.session.lastPage = 'error';
        res.redirect('/error.html');
    }*/
    //else{
        var titolo = req.query.titolo;
        //setto la session
        //req.session.lastPage = '/editor';
        //console.log(titolo.search(/[\/\,\*\._\\\|\[\]{}\s+\@\#\$\^\&\'\"\(\)]/))
        //vedo se la tabella e' gia' stata creata 
        if (titolo == "" || titolo == "{{nome}}" || titolo == null || titolo.search(/null/i) != -1 || titolo == undefined || titolo.search(/[\/\,\*\._\\\|\[\]{}\s+\@\#\$\^\&\'\"\(\)]/) != -1 || titolo.length > 245) {
            res.redirect('/error.html');
        }
        else {
            db.listTables({}, 
                function(err, data){
                    //FOR MIGLIORABILE  
                    for (var i=0; i<=data.TableNames.length; i++){
                        console.log("controllo "+data.TableNames[i]);
                        if (data.TableNames[i] == options.db.amazon_dynamo_operations_table_name+"_"+titolo) {
                            //setto le variabili con la tabella trovata cosi posso lanciare share e uscire dal for
                            console.log("ho trovato la tabella!!!");

                            //controllo lo stato
                            db.describeTable({ 
                                TableName: data.TableNames[i]
                                }, 
                                function(err, data){
                                    //console.log(data);
                                    //se la tabella è ACTIVE posso andare
                                    if (data.Table.TableStatus == "ACTIVE"){
                                        // options.db.amazon_dynamo_operations_table_name = data.Table.TableName;
                                        // options.db.amazon_dynamo_snapshots_table_name = "snapshots_"+titolo;
                                        console.log("READY WE GO!!!!");
                                        goEditor();
                                    }
                                    //se la tabella è CREATING devo aspettare che diventa ACTIVE
                                    else if (data.Table.TableStatus == "CREATING") {
                                        console.log("Attualmente la tabella è "+data.Table.TableStatus);
                                        // options.db.amazon_dynamo_operations_table_name = data.Table.TableName;
                                        // options.db.amazon_dynamo_snapshots_table_name = "snapshots_"+titolo;
                                        setTimeout(function(){waitTableReady()}, (time/2));
                                    }
                                    //se la tabella è DELETING devo aspettare che venga cancellata per poi crearla
                                    else if (data.Table.TableStatus == "DELETING") {
                                        console.log("Attualmente la tabella è "+data.Table.TableStatus+"; time uguale a "+(time/8));
                                        // options.db.amazon_dynamo_operations_table_name = data.Table.TableName;
                                        // options.db.amazon_dynamo_snapshots_table_name = "snapshots_"+titolo;
                                        setTimeout(function(){waitTableReady()}, (time-10000));
                                    }
                                }
                            );
                            break;
                        }
                        else if (data.TableNames[i] == undefined) {
                            console.log("tabella non trovata devo crearla");
                            // options.db.amazon_dynamo_operations_table_name = "ops_"+titolo;
                            // options.db.amazon_dynamo_snapshots_table_name = "snapshots_"+titolo;

                            cr.create(db, options, titolo, function() {
                                //invoco la mia wait personale
                                console.log('sono nella callback');
                                setTimeout(function () {
                                    db.describeTable({ 
                                        TableName: options.db.amazon_dynamo_operations_table_name+'_'+titolo
                                        }, function(err, data){
                                            //console.log(data);
                                            if (data.Table.TableStatus == "ACTIVE"){
                                                console.log("return 0");
                                                goEditor();
                                            }
                                            else {
                                                console.log("Attualmente la tabella è "+data.Table.TableStatus);
                                                waitTableReady();
                                            }
                                            }
                                    );
                                }, time);
                            });
                        }
                    }
                }
            );
        }
    //}
    function waitTableReady(){
        db.describeTable({ 
            TableName: options.db.amazon_dynamo_operations_table_name+'_'+titolo
            }, function(err, data){
                if (data  == null){
                    console.log('NULL fratello!');
                    cr.create(db, options, titolo, function() {
                        //invoco la mia wait personale
                        console.log('sono nella callback del wait');
                        setTimeout(function () {
                            db.describeTable({ 
                                TableName: options.db.amazon_dynamo_operations_table_name+'_'+titolo
                                }, function(err, data){
                                    //console.log(data);
                                    if (data.Table.TableStatus == "ACTIVE"){
                                        console.log("return 0");
                                        goEditor();
                                    }
                                    else {
                                        console.log("Attualmente la tabella è "+data.Table.TableStatus+" nella wait");
                                        waitTableReady();
                                    }
                                    }
                            );
                        }, time);
                    });
                }
                else {
                    if (data.Table.TableStatus == "ACTIVE"){
                        console.log("READY WE GO!!!!");
                        goEditor();
                    }
                    // else if (data.Table.TableStatus == undefined){
                    //     console.log('prova mia '+data.Table.TableStatus);
                    //     options.db.amazon_dynamo_operations_table_name = "ops_"+titolo;
                    //     options.db.amazon_dynamo_snapshots_table_name = "snapshots_"+titolo;
                    // }
                    else {
                        console.log("Attualmente la tabella è "+data.Table.TableStatus);
                        waitTableReady();
                    }
                }
            }
        );
    };
    function goEditor(){
        
        //console.log (titolo);
        // if (titolo == 't2') {
        //     share.attach(app, options);
        //     console.log('non faccio un cazzo');
        //     res.render('editor',{nome:titolo});

        // }
        // else {
        // var share2 = share
        // //console.log(options.db.amazon_s3_snapshots_bucket_name);
        // //console.log("prima di share");
        // console.log('dentro server');
        // console.log(options.db.amazon_dynamo_operations_table_name);
        // var model = share2.createModel(options);
        // //console.log(model);
        // var server = share2.attach(app, options, model);
        // server._events.request.model.on('save', function(){
        //     console.log('PORCO DIO');
        // })
        // server._events.request.model.on('pene', function (doc) {
        //      console.log(doc);
        //  });
        //console.log(util.inspect(server._events.request.listeners('change')));
        //var server2=share.attach2(app, options);
        //console.log(server.model.getSnapshot(titolo));
        //server2.model.delete(titolo);
        //console.log("dopo di share");
        // server._events.request.model.on('exit', function(){
        //     console.log('EXIT PER DIO');
        // });
        //     server._events.request.model.delete(titolo);
        // });
        //server._events.request.model.delete(titolo);
        //server.delete(titolo);
        // bind.toFile('html/tpl/editor.tpl', {
        //     name: "'"+titolo+"'"
        // }, function(data) {
        //     res.writeHead(200, {'Content-Type': 'text/html'});
        //     res.end(data);
        // });
        res.render('editor',{nome:titolo});
        
    };
    // else {
    //     req.session.lastPage = '/editor.html';
    //     res.send('caso strano '+req.session.lastPage);
    // }
});

app.post('/delete.html', function(req, res){
    //console.log(req.session.lastPage);
    /*if (req.session.lastPage != "/editor"){
        console.log('NO!!!!!!!!');
        //console.log(req.session.lastPage);
        //req.session.lastPage = 'error';
        res.redirect('/error.html');
    }*/
    //else{
    
        //setto la variabile di sessione
        //req.session.lastPage = '/delete.html';

        var titolo = req.body.titolo;
        //console.log(options);
        //console.log("il documento da cancellare è "+titolo);
        db.deleteTable ({
            TableName: options.db.amazon_dynamo_operations_table_name+"_"+titolo
        }, function(err, data) { 
            if (err != null) {
                console.log("Error deleting Dynamo ops_"+titolo+" table");
                console.log(err);
            }
            else {
                console.log("Tabella "+options.db.amazon_dynamo_operations_table_name+"_"+titolo+" cancellata");
                //cancello la tabella snapshot
                db.deleteTable({
                    TableName: options.db.amazon_dynamo_snapshots_table_name+"_"+titolo
                }, function(err, data){
                    if (err != null) {
                        console.log("Error deleting Dynamo snapshots_"+titolo+" table");
                        console.log(err);
                    }
                    else {
                        console.log("Tabella "+options.db.amazon_dynamo_snapshots_table_name+"_"+titolo+" cancellata");
                        //cancello su s3
                        s3.deleteObject({ 
                            Bucket: options.db.amazon_s3_snapshots_bucket_name,
                            Key: titolo+"/"+titolo+".zip"
                        }, function(err, data) {
                            if (err != null) {
                                console.log("Error deleting file in s3");
                                console.log(err);
                            }
                            else {
                                console.log("File "+titolo+"/"+titolo+".zip cancellato");
                                // options.db.amazon_dynamo_operations_table_name = "ops";
                                // options.db.amazon_dynamo_snapshots_table_name = "snapshots";
                                res.render('delete');
                                //res.redirect('http://localhost:9000');
                            }
                        })
                    }
                })
            }
        });
    //}
});

app.get('/error.html', function(req, res) {
    //console.log(req.session.lastPage);
    req.session.lastPage = 'error';
    console.log('NO!!!!!!!!');
    //console.log(req.session.lastPage);
    res.render('error');
});

app.get('/export.zip', function(req, res) {
    var file = req.query.file
    //console.log('file= '+file);
    //var filename = file+'/'+file+'.zip';
    s3.getObject({
        Bucket: options.db.amazon_s3_snapshots_bucket_name,
        Key: file+'/'+file+'.zip'
    }, function(err, data) {
        if (err != null){
            console.log(err);
        }
        else {
            //console.log(res);
            res.setHeader('content-disposition', 'form-data; name="filename"; filename="'+file+'.zip"');
            res.send(data.Body);
        }

        /*fs.writeFile('/home/pad/temp/'+file+'.zip', data.Body, function (err) {
            if (err) throw err;
            console.log('File salvato');
            //res.sendfile('/home/pad/temp/'+file+'.zip');
            res.download('/home/pad/temp/'+file+'.zip');
        });*/
    });    
});

// app.post('/import',function(req, res){
//     console.log(req.files)
// })

share.attach(app, options);
app.listen(9000);
console.warn('Server running at http://localhost:9000/');